package ar.com.uade.administradorsiembra.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ar.com.uade.administradorsiembra.common.ContextoTransaccional;
import ar.com.uade.administradorsiembra.modelo.Cereal;
import ar.com.uade.administradorsiembra.modelo.ItemSiembra;
import ar.com.uade.administradorsiembra.modelo.Lote;
import ar.com.uade.administradorsiembra.modelo.LoteSimple;
import ar.com.uade.administradorsiembra.modelo.Propietario;
import ar.com.uade.administradorsiembra.modelo.exceptions.TransaccionException;

public class ItemSiembraMapper extends Mapper<ItemSiembra>{

	private LoteMapper loteMapper;
	private CerealMapper cerealMapper;
	
	public LoteMapper getLoteMapper() {
		if(loteMapper == null){
			this.loteMapper = new LoteMapper();
		}
		return loteMapper;
	}
	public CerealMapper getCerealMapper() {
		if(cerealMapper == null){
			this.cerealMapper = new CerealMapper();
		}
		return cerealMapper;
	}
	public ItemSiembraMapper() {
	     this.loteMapper = new LoteMapper();
	     this.cerealMapper = new CerealMapper();
	}
	@Override
	public boolean guardarTodos(List<ItemSiembra> instancias)
			throws TransaccionException {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean guardar(ItemSiembra instancia, Integer idSiembra) throws TransaccionException  {
		instancia.setIdSiembra(idSiembra);
		return this.guardar(instancia);
	}
	public List<ItemSiembra> buscarPorCereal(int cereal, Date fechaDesde, Date fechaHasta){
		
		List<ItemSiembra> items = new ArrayList<ItemSiembra>();
		ContextoTransaccional contexto = null;

		try {
			contexto = super.administradorTransaccional.crearContexto(true);

			String queryLote = "SELECT Siembra.id, item.id, item.idLote, item.idCereal, item.idSiembra, item.cantidadCosechada"+ 
							   " FROM Siembra INNER JOIN ItemSiembra as item " +
							   " ON item.idSiembra = Siembra.id" +
							   " WHERE Siembra.idCereal = ? ";
			List<Object> parametrosLote = new ArrayList<Object>();
			parametrosLote.add(this.getCerealMapper().buscarPorCodigo(cereal).getId());
			
			ResultSet rsItem;

			try {
				rsItem = this.executeQuery(queryLote, parametrosLote,
						contexto.getConexionActual());
				ItemSiembra item = null;
				while (rsItem.next()) {
					
					item = new ItemSiembra(
								rsItem.getInt(2),
								this.getLoteMapper().buscarPorId(rsItem.getInt("idLote")),
								this.getCerealMapper().buscarPorId(rsItem.getInt("idCereal")),
								rsItem.getFloat("cantidadCosechada"),
								rsItem.getInt(1));
					items.add(item);
				}
			} catch (SQLException e) {
				this.logger.error("Error al buscar todos los itemsSiembra por cereal "
						+ e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar todos los itemSiembra por cereal. "
					+ te.getMessage());
		} finally {
			contexto.liberarConexion();
		}

		return items;
	}
	@Override
	public boolean guardar(ItemSiembra instancia) throws TransaccionException {
		
		int resultado = 0;
		this.logger.info("Guardando el siguiente ItemSiembra: " + instancia);
		
		if(instancia.getId() == null){
			ContextoTransaccional contexto = null;
			
			try {
				contexto = super.administradorTransaccional.crearContexto(true);			
				
				String query = "INSERT INTO ItemSiembra (idLote, idCereal, idSiembra, cantidadCosechada) VALUES (?,?,?,?)";		
				List<Object> parametros = new ArrayList<Object>();
				
				parametros.add(instancia.getLote().getId());
				parametros.add(instancia.getCereal().getId());
				parametros.add(instancia.getIdSiembra());
				parametros.add(instancia.getCantidadSembrada());
				
				try {
					resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
					this.logger.info("Se guardo el ItemSiembra en forma exitosa.");
				} catch (SQLException e) {
					this.logger.error("Error al guardar el ItemSiembra. " + e.getMessage());
				}
			} catch (TransaccionException te) {
				this.logger.error("Error al guardar el ItemSiembra. " + te.getMessage());
			} finally {
				contexto.liberarConexion();
			}
			
			return resultado > 0;
		}
		else{
			return this.modificar(instancia);
		}
	}
	
	

	@Override
	public boolean modificar(ItemSiembra instancia) throws TransaccionException {
		
		this.logger.error("Voy a modificar el instancia: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "UPDATE ItemSiembra SET  idLote  = ? , idCereal  = ? , idSiembra  = ? , cantidadCosechada  = ? WHERE id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getLote().getId());
			parametros.add(instancia.getCereal().getId());
			parametros.add(instancia.getIdSiembra());
			parametros.add(instancia.getCantidadSembrada());
			parametros.add(instancia.getId());
			
			try {			
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());					
			} catch (SQLException e) {
				this.logger.error("Error al modificar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}	
		
		return resultado > 0;
	}

	@Override
	public boolean borrar(ItemSiembra instancia) throws TransaccionException {
		
		this.logger.error("Borrando el instancia: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "DELETE FROM ItemSiembra WHERE id = ?";		
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getId());
			
			try {		
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());				
			} catch (SQLException e) {
				this.logger.error("Error al borrar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return resultado > 0;
	}

	@Override
	public List<ItemSiembra> buscarTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public ItemSiembra buscarPorId(Integer id) {
		// TODO Auto-generated method stub
		return null;
	}
	
	public List<ItemSiembra> buscarPorIdSiembra(int id) {
		
		this.logger.info("Buscando todos los Item siembra");
		
		List<ItemSiembra> resultado = new ArrayList<ItemSiembra>();
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);			
			
			String query = "SELECT  id, idLote, idCereal, idSiembra, cantidadCosechada FROM ItemSiembra  WHERE idSiembra = ?";
			List<Object> parametros = new ArrayList<Object>();
			parametros.add(id);
			ResultSet rs;
			
			try {
				
				rs = this.executeQuery(query, parametros, contexto.getConexionActual());
				
				while(rs.next()){
					Lote lote = this.loteMapper.buscarPorId(rs.getInt("idLote"));
					Cereal cereal = this.cerealMapper.buscarPorId(rs.getInt("idCereal"));
					ItemSiembra itemSiembra = new ItemSiembra(rs.getInt("id"), lote, cereal, rs.getFloat("cantidadCosechada"), rs.getInt("idSiembra"));
					resultado.add(itemSiembra);
					this.logger.info("itemSiembra encontrado: " + itemSiembra);
				}			
			} catch (SQLException e) {
				this.logger.error("Error al buscar el itemSiembra. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el ItemCosecha. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
		
		return resultado;

	}
	

}
